<?php

class FuncaoController extends Controller {

   /**
    * @final   pacote das views deste controller
    */
    const PACKAGE_VIEW = 'funcao';

    /**
     * @var FuncaoService
     */
    private $funcaoService;
    /**
     * @var UsuarioService
     */
    private $usuarioService;
    /**
     * @var PerfilService
     */
    private $perfilService;

    public function __construct() {
        $this->funcaoService = FuncaoService::getInstance();
        $this->usuarioService = UsuarioService::getInstance();
        $this->perfilService = PerfilService::getInstance();
    }

    /**
     * @method  selectCasePerfil
     *
     * Chamado apenas por ajax, localiza todos os perfis que pertecem a determinada funcao
     * e se o IDUsuario for selecionado acha o perfil do usuario especifico para na view
     * usar este perfil como selected
     *
     * @since   2012-01-24
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     */
    public function selectCasePerfil() {
        $ArDados = $_POST;
        multipleEntities($ArDados);
        $Funcao = $this->funcaoService->findById($ArDados['IDFuncao']);
        $Perfil = false;

        if( !empty($ArDados['IDUsuario']) ) {
            $Usuario = $this->usuarioService->findById($ArDados['IDUsuario']);
            $Perfil = $Usuario->getTPerfil();
        }

        $this->save(SESSION_INTERFACE, 'ProfileList', $Funcao->getTPerfil());
        $this->save(SESSION_INTERFACE, 'ProfileSelected', $Perfil);

        $this->view('profile_options', self::PACKAGE_VIEW, true);
    }

    /**
     * @method  listarFuncoes
     *
     * Realiza a listagem das funcoes do projeto e chama a view de listagem
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   Junho de 2012
     */
    public function listarFuncoes() {
        $ArFuncoes = $this->funcaoService->findAll();
        $this->save(SESSION_INTERFACE, 'PositionList', $ArFuncoes);
        $this->view('listar_funcoes', self::PACKAGE_VIEW);
    }

    /**
     * @method  cadastrarFuncao
     *
     * Chama a view para cadastro de funcao
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   Junho de 2012
     */
    public function cadastrarFuncao() {
        $this->view('cadastrar', self::PACKAGE_VIEW);
    }

    /**
     * @method  inserirFuncao
     *
     * Inserir funcao no sistema
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   Junho de 2012
     */
    public function inserirFuncao() {
        if( empty($_POST['StFuncao']) ) {
             $this->saveReturn('O campo "Funcao" n&atilde;o foi recebido.');
        }
        if(!$this->hasReturn()) {
            multipleEntities($ArDados);
            if( $this->funcaoService->save($_POST['StFuncao']) ) {
                $this->saveReturn('Função criado com sucesso.', 1);
            } else {
                $this->saveReturn('Erro ao criar Função.');
            }
        }
        $this->showJsonResponse();
    }

    /**
     * @method  editarFuncao
     *
     * Chama a view de edicao funcao atraves de seu id vindo na url
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   Junho de 2012
     */
    public function editarFuncao() {
        $IDFuncao = treatUrl('id');
        multipleEntities($IDFuncao);
        $this->save(SESSION_INTERFACE, 'Position', $this->funcaoService->findById($IDFuncao));
        $this->view('editar', self::PACKAGE_VIEW);
    }

    /**
     * @method  atualizarFuncao
     *
     * Realiza a alteracao da funcao no sistema
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   Junho de 2012
     */
    public function atualizarFuncao()  {
        $ArDados = $_POST;
        if( empty($ArDados['StFuncao']) ) {
            $this->saveReturn('O campo "Função" n&atilde;o foi recebido.');
        } else if( empty($ArDados['IDFuncao']) ) {
            $this->saveReturn('Erro: O ID do Função não foi enviado corretamente.');
        }

        if(!$this->hasReturn()) {
            multipleEntities($ArDados);
            if( $this->funcaoService->update($ArDados) ) {
                $this->saveReturn('Função atualizado com sucesso.', 1);
            } else {
                $this->saveReturn('Ocorreu um erro ao atualizar a Função.');
            }
        }

        $this->showJsonResponse();
    }

    public function excluirFuncao() {
        $IDFuncao = treatUrl('id');
        multipleEntities($IDFuncao);

        $this->save(SESSION_INTERFACE, 'PositionList', $this->funcaoService->findAll());
        $this->save(SESSION_INTERFACE, 'PositionEdit', $this->funcaoService->findById($IDFuncao));
        $this->view('delete', self::PACKAGE_VIEW);
    }

    public function deletarFuncao() {
        $ArDados = $_POST;
        multipleEntities($ArDados);
        $ArDados['Perfil'] = !empty($ArDados['Perfil']) ? $ArDados['Perfil'] : array();
        foreach ($ArDados['Perfil'] as $IDFuncao) {
            if (!$this->hasReturn() && empty($IDFuncao)) {
                $this->saveReturn('Erro ao receber os ID\'s de Funcao de mudanças.');
            }
        }

        if( !$this->hasReturn() ) {
            $Retorno = $this->funcaoService->delete($ArDados['IDFuncao'], $ArDados['Perfil']);
            $this->saveReturn(
                $Retorno->getMessage(),
                $Retorno->getType()
            );
        }

        $this->showJsonResponse();
    }

    /**
     * @method  visualizarFuncao
     *
     * Chama a view de visualiza��o de funcao
     *
     * @author  Rafael Costa <rcosta.dev@gmail.com>
     * @since   Setembro de 2012
     */

    public function visualizarFuncao() {
        $IDFuncao = treatUrl('id');
        multipleEntities($IDFuncao);
        $Funcao = $this->funcaoService->findById($IDFuncao);
        if (empty($Funcao)) {
            return redirect('funcao', 'listar-funcoes');
        }
        $this->save(SESSION_INTERFACE, 'Function', $Funcao);
        $this->view('visualizar_funcao', self::PACKAGE_VIEW);
    }


}

?>
